package Cliente;

import javax.swing.*;
import java.io.*; 
import java.net.*;

//Clase encargada de implementar la comunicacino con sockets 
class RpcClient{
  
	static private ObjectOutputStream salida; 
	static private ObjectInputStream entrada; 
	static private String mensaje = ""; 
	static private String respuesta="";
	static private String rpcServidor = "localhost"; 
	//static private String rpcServidor = "200.37.127.16";
	static private Socket cliente;   
  
	//Funcion principal de prueba de comunicacion
	public static void main(String []args){
		String temp = comunicar("$1$1$2$2123$2123$");
		System.out.println("< $2$1$9$");
		System.out.println("> "+temp);
	}
  
	//Funcion que indica el comienzo de la comunicacion con el cliente
	static String comunicar(String mensaje){
		iniciarCliente(mensaje);
		return respuesta;
	}
  
	//Funcion que guarda la respuesta del servidor
	private static void setRespuesta(String m){
		respuesta=m;
	}
  
	//Funcino de envio de datos a servidor
	static private void enviarDatos(String mensaje){ 
		try{ 
			salida.writeObject(mensaje); 
			salida.flush(); 
		}catch(IOException excepcionES){ 
			JOptionPane.showMessageDialog(null,"Fallo envio!"); 
		} 
	}
  
  //Funcion que establece la conexion con el servidor
	static private void iniciarCliente(String m){ 
		try{ 
			conectarAServidor();
			obtenerFlujos();
			procesarConexion(m);
		}catch(EOFException e){ 
			JOptionPane.showMessageDialog(null,"Comunicacion Terminada");
		}catch(IOException e) { 
		}finally{ 
			cerrarConexion();
		}	   
	} 
  
  //Funcion que crea la conexion al servidor
	static private void conectarAServidor() throws IOException{ 
		System.out.println("Conectandose al servidor");  
		cliente = new Socket( InetAddress.getByName( rpcServidor ), 12345 ); 
		System.out.println("Conectado a: " + cliente.getInetAddress().getHostName() ); 
	}
  
  //Funcion que confirma la conexion
	static private void obtenerFlujos() throws IOException{ 
		salida = new ObjectOutputStream( cliente.getOutputStream() ); 
		salida.flush();  
		entrada = new ObjectInputStream( cliente.getInputStream() ); 
		System.out.println( "Se establecio la conexion" );
	}
  
  //Funcion que recepciona el mensajes del servidor
	static private void procesarConexion(String m) throws IOException{ 
		enviarDatos(m);
		do{
			try{
				mensaje = (String)entrada.readObject(); 
				if(!mensaje.equals("") || !mensaje.equals("fin")){
					setRespuesta(mensaje);
					break;
				}
			}catch(ClassNotFoundException e){ 
				System.out.println("Error en mensaje");
			} 
		}while(true);
	}
  
  //Funcion que finaliza la comunicacion
	static  private void cerrarConexion(){ 
		System.out.println("Fin de conexion"); 
		enviarDatos("fin"); // flag de termino
		try{
			salida.close(); 
			entrada.close(); 
			cliente.close(); 
		}catch(IOException e){} 
	} 
}
